/**
 * 用户基础逻辑
 * */
import dictMixins from './dictMixins.js';
import http from './request.js'
export default {
	name: 'userMixins',
	mixins: [dictMixins],
	data() {
		return {
			timeout:null
		};
	},
	methods: {
		//搜索防抖
		 debounce(func, wait) {
		        let context = this
		        if (this.timeout) clearTimeout(this.timeout)
		        this.timeout = setTimeout(() => {
		            context[func]()
		        }, wait)
		},
		/**
		 * 判断用户是否在处于角色集合下
		 * @param {Array} roleSet 角色集合
		 * @example 判断用户是学生（2）或家长（3），如果当前用户roles包含2，则返回true
		 * */
		userIs(roleSet) {
			let userRoles = this.user.roles;
			let inSet = userRoles.some(role => {
				return roleSet.includes(role)
			})
			return inSet
		},
		/**
		 * 接口获取用户详情
		 * */
		async fetchUserDetail() {
			let self = this;
			let funcMap = [
				{
					condition() {
						let isOk = self.calMenuShow('我的-学生')
						return isOk;
					},
					async func() {
						let resp = await self.$http.get({url: '/stu/stu/weChat/myInformation'})
						return resp.result;
					}
				},
				{
					condition() {
						let isOk = self.calMenuShow('我的-老师')
						return isOk;
					},
					async func() {
						let resp = await self.$http.post({url: '/oa/teacherInfo/myInfo'})
						return resp.result;
					}
				},
			]
			let filterItem = funcMap.find(item => {
				return item.condition();
			})
			let user = {};
			if (filterItem) {
				user = await filterItem.func();
			}
			return user;
		},
		/**
		 * 判断菜单是否显示
		 * opId：操作权限id
		 * 返回true代表有权限
		 * */
		calMenuShow(opId) {
			let user = this.user;
			if (!user) {
				return [];
			}
			let userMenus = uni.getStorageSync('userMenus') || [];
			let findItems = userMenus;
			let opIds = [];
			findItems.map(item => {
				opIds = opIds.concat(item.opIds);
			})
			let arr = [];
			opIds.map(item => {
				let inArr = arr.some(someItem => {
					return someItem == item
				})
				if (!inArr) {
					arr.push(item);
				}
			})
			let haveOp = arr.includes(opId);
			
			return haveOp;
		},
		noRepeat(sourceArr, key) {
			let arr = [];
			sourceArr.map(item => {
				let value = key ? item[key] : item;
				let inArr = arr.some(someItem => {
					return someItem[key] == value;
				})
				if (!inArr) {
					arr.push(item)
				}
			})
			return arr;
		},
		/**
		 * 获取用户一级菜单，并进行swiper滑动组件数据处理
		*/
		getMenuList(menuList) {
			let list = new Array();
			list = menuList.filter(item => {
				return this.calMenuShow(item.name);
			})
			list = this.noRepeat(list, 'name');
			let eachSwiperNum = 8;
			let swiperCount = Math.ceil(list.length / eachSwiperNum);
			let swiperArr = [];
			for (let index = 1; index <= swiperCount; index++) {
				let min = (index - 1) * eachSwiperNum;
				let max = index * eachSwiperNum;
				let arr = list.filter((item, i) => {
					return i < max && i >= min
				});
				swiperArr.push(arr)
			}
			return swiperArr;yse
		},
		/**
		 * 获取用户有权限的列表
		 * @param {原列表} origanlList 
		 */
		getHaveOpList(origanlList) {
			let list = new Array();
			list = origanlList.filter(item => {
				return this.calMenuShow(item.name);
			})
			list = this.noRepeat(list, 'name');
			return list;
		},
		/**
		 * 处理菜单跳转
		*/
		handleMenuClick(menu) {
			let url = menu.url
			if (menu.notFinish) {
				uni.showToast({
					title: '此模块暂未完成',
					icon:'none'
				})
				return;
			}
			if (menu.menuSetMap) {
				let findOne = menu.menuSetMap.find(item => {
					let inMenu = item.menuNames.some(menuName => {
						return this.calMenuShow(menuName);
					})
					return inMenu;
				})
				url = findOne.url;
			}
			uni.navigateTo({url});
		},
		/**
		 * 检测用户当前状态
		 * 1. 判断token & 业务用户信息是否存在
		 * 2. 不存在token						跳转到获取微信用户信息页，获取token
		 * 3. 存在token & 不存在业务用户信息		可以在微信登录页、账号绑定页使用
		 * 4. 存在token & 存在业务用户信息		可以在所有应用页面使用，不做处理
		 * */
		async handleUserStatus() {
			let haveToken = uni.getStorageSync('Authorization');
			let haveUser = uni.getStorageSync('user');
			if (!haveToken) {	// 不存在token 跳转到获取微信用户信息页，获取token
				uni.reLaunch({
					url: '/pagesLogin/loginRegister/wxLogin'
				})
				return;
			}
			if (haveToken && !haveUser) { // 存在token & 不存在业务用户信息  可以在微信登录页、账号绑定页使用
				let waitCurrentPage = () => {
					// 因为App.vue还没渲染完成，直接获取pages为空，需要等待当前页面渲染出来, 循环100ms等待
					return new Promise((resolve, reject) => {
						let timer = setInterval(() => {
							let pages = getCurrentPages(); 
							if (pages.length > 0) {
								clearInterval(timer)
								resolve(pages[0]);
							}
						}, 100)
					});
				}
				let currentPage = await waitCurrentPage();
				let canUsePages = ['pagesLogin/loginRegister/wxLogin', 'pagesLogin/loginRegister/bindAccount', 'pagesLogin/loginRegister/checkMsg']
				let inCanUsePages = canUsePages.some(pagePath => {
					return currentPage.route.includes(pagePath)
				})
				if (!inCanUsePages) {
					uni.reLaunch({
						url: '/pagesLogin/loginRegister/wxLogin'
					}) 
				}
				return;
			}
		},
		/**
		 * 微信绑定页面中，获取token并请求业务系统用户信息进行页面跳转
		 * 1. 获取微信用户信息请求token
		 * 2. 携带token请求业务系统用户信息
		 * 3. 用户已绑定，跳转到应用页
		 * 4. 用户未绑定，跳转到信息绑定页
		 * */
		async getTokenAndFetchUserInfo() {
			let getCode = () => {
				return new Promise((resolve, reject) => {
					uni.login({
						success(res) {
							resolve(res.code)
						}
					})
				})
			}
			let getWechatUser = () => {
				return new Promise((resolve, reject) => {
					uni.getUserInfo({
						success: async function(res) {
							let userParams = {
								iv: res.iv,
								rawData: res.rawData,
								signature: res.signature,
								encryptedData: res.encryptedData
							}
							resolve(userParams)
						}
					})
				})
			}
			let code = await getCode();
			let userParams = await getWechatUser();
			let params = Object.assign(userParams, {
				code: code
			})
			// 获取微信用户信息请求token
			let resp = await http.post({
				url: '/auth/wechat/code',
				data: params
			})
			uni.setStorageSync('Authorization', resp.result);
			// 携带token请求业务系统用户信息
			this.fetchUserInfoAct();
		},
		/**
		 * 获取业务系统用户信息
		 * 1. 用户信息存在，跳转应用页
		 * 2. 用户信息不存在，接口code：999995，自动跳转绑定页
		 * */
		async fetchUserInfoAct() {
			let resp = await http.post({
				url: '/auth/wechat/userInfo',
				data: {}
			});
			uni.setStorageSync('user', resp.result);
			// 跳转之前获取所有字典
			await this.fetchAllDict();
			uni.reLaunch({
				url: '/pages/application/application'
			})
		},
		/**
		 * 获取用户小程序角色数据
		 * */
		async fetchUserRoleInfoAct(callback) {
			let resp = await http.post({
				url: '/auth/wechat/userMenus',
				data: {}
			});
			let data = [];
			if (resp.result) {
				data = resp.result.map(item => {
					item.opIds = item.opIds.map(obj => { return obj.menuName });
					return item;
				})
			}
			// let data = [
			// 	{
			// 		roleType: 0,
			// 		opIds: [
			// 		'企业实践', '竞赛信息', '教师培训', '我的荣耀', '教师档案', '在研课题', '论文发表', '论文获奖', '竞赛获奖', '指导学生获奖',
			// 		'技术专利', '技能证书', '出版著作', '表彰']
			// 	}
			// ]
			uni.setStorageSync('userMenus', data);
			callback && callback();
		}
	},
	computed: {
		user() {
			let user = uni.getStorageSync('user');
			if (user) {
				user.roleTypeName = this.getDictNameWithCodeAndValue('dict_account_type', user.roleType);
			}
			return user; 
		},
		userMenus() {
			let userMenus = uni.getStorageSync('userMenus');
			return userMenus;
		}
	},
}